package com.iwhalecloud.citybrain.flow.platform.manager.domain.repository;

import com.alibaba.fastjson.JSONObject;
import com.iwhalecloud.citybrain.flow.platform.manager.common.CheckResult;
import com.iwhalecloud.citybrain.flow.platform.manager.common.ResponseResult;
import com.iwhalecloud.citybrain.flow.platform.manager.common.client.*;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.*;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.model.NextNodeAssigneeTaskDTO;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.model.NextNodeCandidateTaskDTO;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.monitor.FlowTaskTraceVo;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.task.*;
import com.iwhalecloud.citybrain.flow.platform.manager.domain.model.user.UserMeta;
import org.flowable.bpmn.model.SequenceFlow;
import org.flowable.task.api.Task;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;

import java.util.List;

/**
 * @author lilh
 * @date 2019-01-23 18:52
 */
public interface FlowTaskService {
    /**
     * 获取可跳转环节列表
     *
     * @param processInstanceId 流程实例id
     * @return 当前环节和待跳转列表
     */
    ResponseResult getTaskSkipList(String processInstanceId);


    ResponseResult skipTask(TaskSkipVo taskSkipVo);

    /**
     * 任务驳回
     *
     * @param taskHandleVo vo
     */
    void backToStep(Task task, TaskHandleVo taskHandleVo);

    /**
     * 获取可回退任务节点信息
     *
     * @param taskId 任务id
     * @return 当前环节和待跳转环节列表
     */
    ResponseResult getTaskBackList(String taskId);


    /**
     * 回退
     *
     * @param taskRollbackVo 回退参数
     * @return 是否回退成功
     */
    boolean rollback(TaskRollbackVo taskRollbackVo);

    /**
     * 转办
     *
     * @param turnTaskVo 转办任务VO
     * @return 返回信息
     */
    ResponseResult turnTask(TurnTaskVo turnTaskVo);


    /**
     * 处理转办任务，将核心逻辑抽出来
     * @param turnTaskVo
     * @param user
     * @return
     */
    ResponseResult dealTurnTask(TurnTaskVo turnTaskVo, User user);


    /**
     * 指定下一节点审批人
     * @param nextNodeAssigneeTaskDTO 下一节点审批人
     * @return 返回信息
     */
    ResponseResult appointNextNodeAssignee(NextNodeAssigneeTaskDTO nextNodeAssigneeTaskDTO);


    /**
     * 查询下一个设置的审批人编码
     * @param baseTaskVo
     * @return
     */
    ResponseResult getNextNodeAssgineeParam(BaseTaskVo baseTaskVo);
    /**
     * 任务签收
     *
     * @param taskClaimVo 签收任务VO
     * @return 返回信息
     */
    ResponseResult claim(TaskClaimVo taskClaimVo);


    /**
     *
     * @param processInstanceId 流程实例编号
     * @param currentActivityId 当前节点编号
     * @return 当前节点之后的连接线
     */
    List<SequenceFlow> getNextFlowNodeByProcessInstanceId(String processInstanceId, String currentActivityId);

    /**
     *
     * @param procesDefinitionId 流程实例编号
     * @param currentActivityId 当前节点编号
     * @return 当前节点之后的连接线
     */
    List<SequenceFlow> getNextFlowNodeByProcesDefinitionId(String procesDefinitionId,String currentActivityId);



        /**
         * 任务完成
         *
         * @param taskHandleVo 完成任务VO
         * @return 返回信息
         */
    ResponseResult complete(TaskHandleVo taskHandleVo);

    /**
     * 先签收任务，再完成任务
     *
     * @param taskHandleVo 完成任务VO
     * @return 返回信息
     */
    ResponseResult completeWithClaim(TaskHandleVo taskHandleVo);

    /**
     * 使用外置表单完成签收
     * @param taskHandleVo
     * @return
     */
    ResponseResult completeWithExternalForm(TaskHandleVo taskHandleVo);

    /**
     * 使用外置表单，先完成签收，再完成任务
     */
    ResponseResult completeWithClaimAndExternalForm(TaskHandleVo taskHandleVo);

    /**
     * 保存任务填报的表单草稿数据
     *
     * @param taskHandleVo 表单草稿数据
     * @return 是否成功
     */
    Boolean saveFormInstanceDraft(TaskHandleVo taskHandleVo);
    /**
     * 根据任务编号查询当前节点会签的人员信息
     * @param baseTaskVo 任务信息
     * @return 当前节点加签的人员信息
     */
    ResponseResult<List<UserMeta>> getAssignee(BaseTaskVo baseTaskVo);


    /**
     * 根据任务编号查询当前节点会签的人员信息
     * @param taskId 会签子任务编号
     * @return 当前节点加签的人员信息
     */
    List<UserMeta> getAssignee(String taskId);
    /**
     * 任务加签
     *
     * @param addSignTaskVo 任务加签VO
     * @return 返回信息
     */
    ResponseResult addSignTask(AddSignTaskVo addSignTaskVo);

    /**
     * 任务延期
     *
     * @param delayTaskVo 任务延期VO
     * @return 返回信息
     */
    ResponseResult delayTask(DelayTaskVo delayTaskVo);

    ResponseResult getTaskTimeout(String taskId);


    /**
     * 任务委派
     * @param taskDelegateVo
     * @return
     */
    ResponseResult delegateTask(TaskDelegateVo taskDelegateVo);



     CheckResult checkAssignee(String taskId, User user);


    /**
     * 减签
     * @param deleteSignTaskVo
     * @return
     */
    ResponseResult deleteSignTask(DeleteSignTaskVo deleteSignTaskVo);

    /**
     * 根据流程实例编号查询当前的任务实例
     * 要根据用户做过滤
     * @param processInstanceId
     * @return
     */
    TaskDTO getUserCurrentTask(String processInstanceId);

    /**
     * @Description 根据taskId获取流程指定一下节点处理人业务
     * @author liujinjian
     * @date 2021-10-18
     * @param taskId
     * @return
     */
    List<FlowSpecifyTheNodeHandlerTaskQueryInfo> getSpecifyTheNodeHandlerTask(String taskId);

    /**
     * @Description 指定下一节点审批人
     * @author liujinjian
     * @date 2021-10-22
     * @param nextNodeCandidateTaskDTO 下一节点审批人
     * @return 返回信息
     */
    ResponseResult appointNextNodeCandidate(NextNodeCandidateTaskDTO nextNodeCandidateTaskDTO);

    /**
     * @Description 根据类型和编码获取当前编码下得人员列表信息
     * @author liujinjian
     * @date 2021-11-01
     * @param type
     * @param code
     * @param processInstanceId
     * @return
     */
    FlowTaskCandidateDataTypeVo getChildCandidate(String type, String code, String processInstanceId, String userCode) throws Exception;


    /**
     * 根据任务编号查询任务配置的审批页面
     * @param taskId
     * @return
     */
    String getTaskExternalFormUrl(String taskId);


    /**
     * 判断userCode是否为task的候选人
     * @param taskId
     * @param userCode
     * @return
     */
    FlowTaskTraceVo getFlowTaskByTaskIdOrUserCode(String taskId, String userCode);

    /**
     * @Description 根据实例ID和节点编码获取当前节点候选人对象
     * @author liujinjian
     * @date 2021-11-11
     * @param processInstanceId
     * @param nodeCode
     * @return
     */
    FlowSpecifyTheNodeHandlerTaskQueryInfo getCurrentNodeCandidateInfo(String processInstanceId, String nodeCode) throws Exception;


    /**
     * 根据任务id判断是否必须表达意见
     * @param taskId
     * @return
     */
    String mustExpress(String taskId);

    /**
     * 任务委派或指派(Feign接口)
     *
     * @param httpDelegateTaskDto
     * @return
     */
    ResponseResult delegateTaskByHttpRequest(HttpDelegateTaskDto httpDelegateTaskDto);

    /**
     * 任务加签或多级加签(Feign接口)
     *
     * @param httpAddSignTaskDto
     * @return
     */
    ResponseResult addSignTaskByHttpRequest(HttpAddSignTaskDto httpAddSignTaskDto);


    /**
     * 减签
     * @param httpDeleteSignTaskDto
     * @return
     */
    ResponseResult deleteSignTaskByHttpRequest(HttpDeleteSignTaskDto httpDeleteSignTaskDto);
    /**
     * 拿回
     * @param taskTakeBackDto
     * @return
     */
    ResponseResult takeBack( HttpTaskTakeBackDto taskTakeBackDto);

    /**
     * 获取上次设置的候选人
     *
     * @param taskId
     * @param nodeCode
     * @return
     */
    List<ModelNextNodeCandidateSettings> getLastCandidate(String taskId, String nodeCode);

    /**
     * 获取所有节点上次设置的候选人
     *
     * @param processInstanceId
     * @return
     */
    List<NodeCandidateUsersSetting> getAllLastCandidate(String processInstanceId);

    /**
     * 获取指定节点最新设置的候选人或者最近审批人信息
     *
     * @param processInstanceId
     * @param nodeCode
     * @return
     */
    ResponseResult getLastCandidateOrOperator(String processInstanceId, String nodeCode);

    /**
     * 批量转办待办任务
     *
     * @param batchTurnTaskVo 转办任务VO
     * @return 返回信息
     */
    ResponseResult batchTurnTasks(BatchTurnTaskVo batchTurnTaskVo);



    /**
     * 更新待办中的【计划完成时间】
     *
     * @param httpUpdateCompTimeDto 工作项id等信息
     * @return 处理结果
     */
    ResponseResult updateTaskCompTime(HttpUpdateCompTimeDto httpUpdateCompTimeDto);


    /**
     * 获取流程实例当前任务信息
     *
     * @param processInstanceId 流程实例id
     * @return 当前节点信息
     */
    ResponseResult getCurrentTaskInfo(String processInstanceId);



    void flowDirector(JSONObject requsetParam);


    /**
     * 批量同步待办任务至待办组件
     *
     * @param tasksManagerDTOS
     * @return
     */
    ResponseResult batchInsertToTasksManager(HttpTaskManagerBatchDto tasksManagerDTOS);

}
